package org.cunamas.web.controller;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import org.cunamas.core.bean.LogBean;
import org.cunamas.core.dto.AsistenciaGrupoEtareoDto;
import org.cunamas.core.dto.CoberturaAtencionDto;
import org.cunamas.core.dto.ComitesDesempenioDto;
import org.cunamas.core.dto.ComparativaPesoTallaDto;
import org.cunamas.core.dto.ComparativaTallaEdadDto;
import org.cunamas.core.dto.CulturaCrianzaDto;
import org.cunamas.core.dto.DesempenioAnioDto;
import org.cunamas.core.dto.DesempenioPracticaDto;
import org.cunamas.core.dto.Filtros;
import org.cunamas.core.dto.GraficoBarrasDto;
import org.cunamas.core.dto.PermanenciaDto;
import org.cunamas.core.dto.PracticasCrianzaDto;
import org.cunamas.core.service.ReportesCunamasService;
import org.cunamas.web.util.CunamasConstants;
import org.cunamas.web.util.MessagesView;
import org.cunamas.web.util.WebUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("session")
public class IndicatorsMonitoringController { 
	
	@Autowired
	private ReportesCunamasService cunamasService;
	
	private List<CoberturaAtencionDto> coberturaAtencionDtos = new ArrayList<CoberturaAtencionDto>();
	
	private List<AsistenciaGrupoEtareoDto> grupoEtareoDtos = new ArrayList<AsistenciaGrupoEtareoDto>();
	
	private List<GraficoBarrasDto> tallaEdadDtos = new ArrayList<GraficoBarrasDto>();
	
	private List<GraficoBarrasDto> pesoTallaDtos = new ArrayList<GraficoBarrasDto>();
	
	private List<GraficoBarrasDto> desempenoMadresDtos = new ArrayList<GraficoBarrasDto>();
	
	private List<ComparativaTallaEdadDto> tallaEdadLeyenda = new ArrayList<ComparativaTallaEdadDto>();
	
	private List<ComparativaPesoTallaDto> pesoTallaLeyenda = new ArrayList<ComparativaPesoTallaDto>();
	
	private List<PracticasCrianzaDto> practicasCrianzaDtos = new ArrayList<PracticasCrianzaDto>();
	
	private List<CulturaCrianzaDto> culturaCrianzaDtos = new ArrayList<CulturaCrianzaDto>();
	
	private List<DesempenioPracticaDto> desempenioPracticaDtos = new ArrayList<DesempenioPracticaDto>();
	
	private List<DesempenioAnioDto> desempenioAnioDtos = new ArrayList<DesempenioAnioDto>();
	
	private List<PermanenciaDto> permanenciaDtos = new ArrayList<PermanenciaDto>();
	
	private List<ComitesDesempenioDto> comitesDesempenioDtos = new ArrayList<ComitesDesempenioDto>();
	
	private List<SelectItem> listaProv = new ArrayList<SelectItem>();
	
	private List<SelectItem> listaDis = new ArrayList<SelectItem>();

	private List<SelectItem> listaDep = new ArrayList<SelectItem>();
	
	private List<SelectItem> listaSede = new ArrayList<SelectItem>();
	
	private List<SelectItem> listaComite = new ArrayList<SelectItem>();
	
	private String imgMap=CunamasConstants.IMG_PERU;
	
	private String departamento="00";
	private String provincia="00";
	private String distrito="00";
	private String ubigeo="";
	private String comite="000";
	private String sede="000";
	private String anio;
	private String mes;
	
	private String paramLabelCobertura="";
	private String paramNivel="";
	private String paramAnio="";
	private String paramMes="";
	private String paramAnioGeneral="";
	private String paramMesGeneral="";
	private String paramNiniosTotal="";
	private String paramModulosTotal="";
	private String paramComitesTotal="";
	private String paramDistritosTotal="";
	
	private String onload = "";
	
	private String messageError;
	private boolean validForm;
	
	private void cleanParametros(){
		departamento="00";
		provincia="00";
		distrito="00";
		ubigeo="";
		comite="000";
		sede="000";
		anio = null;
		mes = null;
		
		paramLabelCobertura="";
		paramNivel="";
		paramAnio="";
		paramMes="";
		paramMesGeneral="";
		paramNiniosTotal="";
		paramModulosTotal="";
		paramComitesTotal="";
		paramDistritosTotal="";
	}
	
    public boolean validate(){
    	messageError = null;
    	validForm = true;
    	
    	if(anio==null || anio.equals("") || anio.equals("00")){
    		messageError = MessagesView.getI18nMessage("general.anio.null");
    		validForm = false;
    		return false;
    	}
    	
    	if(mes==null || mes.equals("") || mes.equals("00")){
    		messageError = MessagesView.getI18nMessage("general.mes.null");
    		validForm = false;
    		return false;
    	}
    	
    	return true;
    }
	
	public void generarReporte(){
		if(!validate()) return;
			
		Filtros filtros = new Filtros(getUbigeo(),sede,comite,anio,mes);
		LogBean logBean=null;
		try {
			setImgMap(getUbigeo()+".png");
			
			coberturaAtencionDtos=cunamasService.retornaCoberturaAtencion(filtros);		
			if(coberturaAtencionDtos==null) coberturaAtencionDtos = new ArrayList<CoberturaAtencionDto>();
			
			grupoEtareoDtos=cunamasService.retornaAsistenciaGrupoEtareo(filtros);
			if(grupoEtareoDtos==null) grupoEtareoDtos = new ArrayList<AsistenciaGrupoEtareoDto>();
		
			tallaEdadDtos=cunamasService.retornaAtencionIntegralTallaEdad(filtros);
			cargaTablaLeyendaTallaEdad(tallaEdadDtos);
			if(tallaEdadDtos==null) tallaEdadDtos = new ArrayList<GraficoBarrasDto>();
			
			pesoTallaDtos=cunamasService.retornaAtencionIntegralPesoTalla(filtros);
			cargaTablaLeyendaPesoTalla(pesoTallaDtos);
			if(pesoTallaDtos==null) pesoTallaDtos = new ArrayList<GraficoBarrasDto>();
			
			permanenciaDtos=cunamasService.retornaPermanencia(filtros);
			if(permanenciaDtos==null) permanenciaDtos = new ArrayList<PermanenciaDto>();
			
			desempenoMadresDtos=cunamasService.retornaDesempenoMadres(filtros);
			Collections.sort(desempenoMadresDtos);
			if(desempenoMadresDtos==null) desempenoMadresDtos = new ArrayList<GraficoBarrasDto>();
				
			culturaCrianzaDtos=cunamasService.retornaCulturaCrianza(filtros);
			if(culturaCrianzaDtos==null) culturaCrianzaDtos = new ArrayList<CulturaCrianzaDto>();
			
			practicasCrianzaDtos=cunamasService.retornaPracticasCrianza(filtros);
			if(practicasCrianzaDtos==null) practicasCrianzaDtos = new ArrayList<PracticasCrianzaDto>();
					
			desempenioPracticaDtos = cunamasService.retornaDesempanioPractica(filtros);
			if(desempenioPracticaDtos==null)desempenioPracticaDtos = new ArrayList<DesempenioPracticaDto>();
			
			desempenioAnioDtos = cunamasService.retornaDesempanioAnio(filtros);
			if(desempenioAnioDtos==null)desempenioAnioDtos = new ArrayList<DesempenioAnioDto>();
				
			comitesDesempenioDtos = cunamasService.retornaComiteDesempenio(filtros);
			if(comitesDesempenioDtos==null)comitesDesempenioDtos = new ArrayList<ComitesDesempenioDto>();
			
			construyeTextoCobertura(coberturaAtencionDtos);	
			
			construyeNombreCabecera();
			
			logBean = new LogBean(CunamasConstants.COD_REPORTE_MONITOREO, CunamasConstants.NOMBRE_REPORTE_MONITOREO, filtros.toString(), new Date(), new Short("1"),"");

		} catch (Exception e) {
			logBean = new LogBean(CunamasConstants.COD_REPORTE_MONITOREO, CunamasConstants.NOMBRE_REPORTE_MONITOREO, filtros.toString(), new Date(), new Short("0"),e.getMessage());
		}
		
		cunamasService.persistLog(logBean);
	}
	
	private void cargaTablaLeyendaTallaEdad(List<GraficoBarrasDto> listdto) {
		List<ComparativaTallaEdadDto> periodoCategoriaList = new ArrayList<ComparativaTallaEdadDto>();
		ComparativaTallaEdadDto periodoCategoriaDto;
		boolean existe=false;
		for (GraficoBarrasDto dto : listdto) {
			periodoCategoriaDto = new ComparativaTallaEdadDto();
			periodoCategoriaDto.setPeriodo(dto.getPeriodo());
			for (ComparativaTallaEdadDto periodoCategoria : periodoCategoriaList) {
				if(periodoCategoria.getPeriodo().equalsIgnoreCase(dto.getPeriodo())) existe = true;
				else existe=false;
			}
			if(!existe)periodoCategoriaList.add(periodoCategoriaDto);
		}
		List<ComparativaTallaEdadDto> periodoCategoriaListCompleta = new ArrayList<ComparativaTallaEdadDto>();
		for (ComparativaTallaEdadDto periodoCategoria : periodoCategoriaList) {
			for (GraficoBarrasDto dto : listdto) {
				if(periodoCategoria.getPeriodo().equalsIgnoreCase(dto.getPeriodo())){
					if(dto.getCodCategoria()==1){
						periodoCategoria.setAltoValorP(dto.getPorcentajeValor());
					}
					if(dto.getCodCategoria()==2){
						periodoCategoria.setNormalValorP(dto.getPorcentajeValor());
					}
					if(dto.getCodCategoria()==3){
						periodoCategoria.setBajaValorP(dto.getPorcentajeValor());
					}
				}
			}
			periodoCategoriaListCompleta.add(periodoCategoria);
		}
		
		tallaEdadLeyenda=periodoCategoriaListCompleta;
	}

	
	private void cargaTablaLeyendaPesoTalla(List<GraficoBarrasDto> listdto) {
		List<ComparativaPesoTallaDto> periodoCategoriaList = new ArrayList<ComparativaPesoTallaDto>();
		ComparativaPesoTallaDto periodoCategoriaDto;
		boolean existe=false;
		for (GraficoBarrasDto dto : listdto) {
			periodoCategoriaDto = new ComparativaPesoTallaDto();
			periodoCategoriaDto.setPeriodo(dto.getPeriodo());
			for (ComparativaPesoTallaDto periodoCategoria : periodoCategoriaList) {
				if(periodoCategoria.getPeriodo().equalsIgnoreCase(dto.getPeriodo())) existe = true;
				else existe=false;
			}
			if(!existe)periodoCategoriaList.add(periodoCategoriaDto);
		}
		List<ComparativaPesoTallaDto> periodoCategoriaListCompleta = new ArrayList<ComparativaPesoTallaDto>();
		for (ComparativaPesoTallaDto periodoCategoria : periodoCategoriaList) {
			for (GraficoBarrasDto dto : listdto) {
				if(periodoCategoria.getPeriodo().equalsIgnoreCase(dto.getPeriodo())){
					if(dto.getCodCategoria()==1){
						periodoCategoria.setObesidad(dto.getPorcentajeValor());
					}
					if(dto.getCodCategoria()==2){
						periodoCategoria.setSobrepeso(dto.getPorcentajeValor());
					}
					if(dto.getCodCategoria()==3){
						periodoCategoria.setNormal(dto.getPorcentajeValor());
					}
					if(dto.getCodCategoria()==4){
						periodoCategoria.setDesnutricionAguda(dto.getPorcentajeValor());
					}
					if(dto.getCodCategoria()==5){
						periodoCategoria.setDesnutricionSevera(dto.getPorcentajeValor());
					}
				}
			}
			periodoCategoriaListCompleta.add(periodoCategoria);
		}
		
		pesoTallaLeyenda=periodoCategoriaListCompleta;
	}
	
	public String getOnload() {
		messageError = null;
		validForm=false;
		cleanParametros();
		listaDep.clear();
		listaDis.clear();
		listaProv.clear();
		listaSede.clear();
		listaComite.clear();
		listaDep = cunamasService.retornaDepartamentos();
		return onload;
	}

	public void cargaComite(){
		listaComite.clear();
		if(distrito!="00"){
		String ubigeo=departamento+provincia+distrito;
		listaComite = cunamasService.retornaComite(ubigeo);
		}else{
			listaComite.clear();
		}
	}
	
	public void cargaProvincias(){
		listaProv.clear();
		listaDis.clear();
		listaSede.clear();
		System.out.println(departamento);
		if(!"00".equalsIgnoreCase(departamento)){
			listaProv = cunamasService.retornaProvincia(departamento);
			listaSede = cunamasService.retornaSede(departamento);
		}else{
			setImgMap(CunamasConstants.IMG_PERU);
			listaDis.clear();
			listaProv.clear();
			listaSede.clear();
		}	
		
		/*if("14".equalsIgnoreCase(departamento)){
			System.out.println("departameto:lambayeque");
			setImgMap(CunamasConstants.IMG_DEP_LAMBYQ);
		}*/
	}
	
	
	public void cargaDistrito(){
		listaDis.clear();
		if(provincia!="00")
			listaDis = cunamasService.retornaDistrito(departamento+provincia);
		else{
			listaProv.clear();
		}
	}
	
	public void setOnload(String onload) {
		this.onload = onload;
	}

	

	public List<CoberturaAtencionDto> getCoberturaAtencionDtos() {
		return coberturaAtencionDtos;
	}

	public void setCoberturaAtencionDtos(
			List<CoberturaAtencionDto> coberturaAtencionDtos) {
		this.coberturaAtencionDtos = coberturaAtencionDtos;
	}



	public String getDepartamento() {
		return departamento;
	}



	public void setDepartamento(String departamento) {
		this.departamento = departamento;
	}



	public String getProvincia() {
		return provincia;
	}



	public void setProvincia(String provincia) {
		this.provincia = provincia;
	}



	public String getDistrito() {
		return distrito;
	}



	public void setDistrito(String distrito) {
		this.distrito = distrito;
	}



	public String getSede() {
		return sede;
	}



	public void setSede(String sede) {
		this.sede = sede;
	}



	public String getAnio() {
		return anio;
	}



	public void setAnio(String anio) {
		this.anio = anio;
	}



	public String getMes() {
		return mes;
	}



	public void setMes(String mes) {
		this.mes = mes;
	}



	public List<SelectItem> getListaProv() {
		return listaProv;
	}



	public void setListaProv(List<SelectItem> listaProv) {
		this.listaProv = listaProv;
	}



	public List<SelectItem> getListaDis() {
		return listaDis;
	}



	public void setListaDis(List<SelectItem> listaDis) {
		this.listaDis = listaDis;
	}



	public List<SelectItem> getListaDep() {
		return listaDep;
	}



	public void setListaDep(List<SelectItem> listaDep) {
		this.listaDep = listaDep;
	}



	public List<SelectItem> getListaSede() {
		return listaSede;
	}



	public void setListaSede(List<SelectItem> listaSede) {
		this.listaSede = listaSede;
	}



	public List<AsistenciaGrupoEtareoDto> getGrupoEtareoDtos() {
		return grupoEtareoDtos;
	}



	public void setGrupoEtareoDtos(List<AsistenciaGrupoEtareoDto> grupoEtareoDtos) {
		this.grupoEtareoDtos = grupoEtareoDtos;
	}



	public List<GraficoBarrasDto> getTallaEdadDtos() {
		return tallaEdadDtos;
	}



	public void setTallaEdadDtos(List<GraficoBarrasDto> tallaEdadDtos) {
		this.tallaEdadDtos = tallaEdadDtos;
	}



	public List<GraficoBarrasDto> getPesoTallaDtos() {
		return pesoTallaDtos;
	}



	public void setPesoTallaDtos(List<GraficoBarrasDto> pesoTallaDtos) {
		this.pesoTallaDtos = pesoTallaDtos;
	}



	public List<SelectItem> getListaComite() {
		return listaComite;
	}



	public void setListaComite(List<SelectItem> listaComite) {
		this.listaComite = listaComite;
	}



	public String getComite() {
		return comite;
	}


	public void setComite(String comite) {
		this.comite = comite;
	}

	public List<ComparativaTallaEdadDto> getTallaEdadLeyenda() {
		return tallaEdadLeyenda;
	}

	public void setTallaEdadLeyenda(List<ComparativaTallaEdadDto> tallaEdadLeyenda) {
		this.tallaEdadLeyenda = tallaEdadLeyenda;
	}

	public List<ComparativaPesoTallaDto> getPesoTallaLeyenda() {
		return pesoTallaLeyenda;
	}

	public void setPesoTallaLeyenda(List<ComparativaPesoTallaDto> pesoTallaLeyenda) {
		this.pesoTallaLeyenda = pesoTallaLeyenda;
	}

	public List<PermanenciaDto> getPermanenciaDtos() {
		return permanenciaDtos;
	}

	public List<GraficoBarrasDto> getDesempenoMadresDtos() {
		return desempenoMadresDtos;
	}

	public void setDesempenoMadresDtos(List<GraficoBarrasDto> desempenoMadresDtos) {
		this.desempenoMadresDtos = desempenoMadresDtos;
	}

	public void setPermanenciaDtos(List<PermanenciaDto> permanenciaDtos) {
		this.permanenciaDtos = permanenciaDtos;
	}

	public List<PracticasCrianzaDto> getPracticasCrianzaDtos() {
		return practicasCrianzaDtos;
	}

	public List<CulturaCrianzaDto> getCulturaCrianzaDtos() {
		return culturaCrianzaDtos;
	}

	public void setPracticasCrianzaDtos(
			List<PracticasCrianzaDto> practicasCrianzaDtos) {
		this.practicasCrianzaDtos = practicasCrianzaDtos;
	}

	public void setCulturaCrianzaDtos(List<CulturaCrianzaDto> culturaCrianzaDtos) {
		this.culturaCrianzaDtos = culturaCrianzaDtos;
	}

	public List<DesempenioPracticaDto> getDesempenioPracticaDtos() {
		return desempenioPracticaDtos;
	}

	public void setDesempenioPracticaDtos(
			List<DesempenioPracticaDto> desempenioPracticaDtos) {
		this.desempenioPracticaDtos = desempenioPracticaDtos;
	}

	public List<DesempenioAnioDto> getDesempenioAnioDtos() {
		return desempenioAnioDtos;
	}

	public void setDesempenioAnioDtos(List<DesempenioAnioDto> desempenioAnioDtos) {
		this.desempenioAnioDtos = desempenioAnioDtos;
	}

	public List<ComitesDesempenioDto> getComitesDesempenioDtos() {
		return comitesDesempenioDtos;
	}

	public void setComitesDesempenioDtos(
			List<ComitesDesempenioDto> comitesDesempenioDtos) {
		this.comitesDesempenioDtos = comitesDesempenioDtos;
	}

	public String getImgMap() {
		return imgMap;
	}

	public void setImgMap(String imgMap) {
		this.imgMap = imgMap;
	}
	
	public void construyeTextoCobertura(List<CoberturaAtencionDto> atencionDtos){
		 Integer paramNiniosTotal=0;
		 Integer paramModulosTotal=0;
		 Integer paramComitesTotal=0;
		 Integer paramDistritosTotal=0;
		 String[] referencia = WebUtil.retornaMesYAnioReferencia(anio, mes).split(",");
		 setParamAnio(referencia[0]);
		setParamMes(mes!=null&&mes.length()>0?referencia[1]:"");
		for (CoberturaAtencionDto dto : atencionDtos) {
			paramNiniosTotal+=Integer.valueOf(dto.getBenefTotal());
			paramModulosTotal+=Integer.valueOf(dto.getTotalModulos());
			paramComitesTotal+=Integer.valueOf(dto.getTotalComitesGestion());
			paramDistritosTotal+=Integer.valueOf(dto.getTotalDistritos());
		}
		setParamNiniosTotal(paramNiniosTotal.toString());
		setParamModulosTotal(paramModulosTotal.toString());
		setParamComitesTotal(paramComitesTotal.toString());
		setParamDistritosTotal(paramDistritosTotal.toString());
		
	}
	
	public void construyeNombreCabecera(){
		setParamMesGeneral(WebUtil.retornaNombreMes(Integer.valueOf(mes)));
		setParamAnioGeneral(anio);
		if("000000".equalsIgnoreCase(getUbigeo())){
			setParamNivel("NACIONAL");
			setParamLabelCobertura("Departamento");
		}
		else
			if(!"00".equalsIgnoreCase(departamento)&&"00".equalsIgnoreCase(provincia)&&"00".equalsIgnoreCase(distrito)){
				setParamNivel("DEPARTAMENTAL");
				setParamLabelCobertura("Provincia");
			}else
				if(!"00".equalsIgnoreCase(departamento)&&!"00".equalsIgnoreCase(provincia)&&"00".equalsIgnoreCase(distrito)){
					setParamNivel("PROVINCIAL");
					setParamLabelCobertura("Distrito");
				}
				else
					if(!"00".equalsIgnoreCase(departamento)&&!"00".equalsIgnoreCase(provincia)&&!"00".equalsIgnoreCase(distrito)){
						setParamNivel("DISTRITAL");	
						setParamLabelCobertura("Com. Gest.");
					}
							
	}

	public String getUbigeo() {
		StringBuffer sb = new StringBuffer();
		return sb.append(departamento).append(provincia).append(distrito).toString();
	}

	public void setUbigeo(String ubigeo) {
		this.ubigeo = ubigeo;
	}

	public String getParamNivel() {
		return paramNivel;
	}

	public void setParamNivel(String paramNivel) {
		this.paramNivel = paramNivel;
	}

	public String getParamAnio() {
		return paramAnio;
	}

	public String getParamMes() {
		return paramMes;
	}

	public void setParamAnio(String paramAnio) {
		this.paramAnio = paramAnio;
	}

	public void setParamMes(String paramMes) {
		this.paramMes = paramMes;
	}

	public String getParamNiniosTotal() {
		return paramNiniosTotal;
	}

	public String getParamModulosTotal() {
		return paramModulosTotal;
	}

	public String getParamComitesTotal() {
		return paramComitesTotal;
	}

	public String getParamDistritosTotal() {
		return paramDistritosTotal;
	}

	public void setParamNiniosTotal(String paramNiniosTotal) {
		this.paramNiniosTotal = paramNiniosTotal;
	}

	public void setParamModulosTotal(String paramModulosTotal) {
		this.paramModulosTotal = paramModulosTotal;
	}

	public void setParamComitesTotal(String paramComitesTotal) {
		this.paramComitesTotal = paramComitesTotal;
	}

	public void setParamDistritosTotal(String paramDistritosTotal) {
		this.paramDistritosTotal = paramDistritosTotal;
	}

	public String getParamLabelCobertura() {
		return paramLabelCobertura;
	}

	public void setParamLabelCobertura(String paramLabelCobertura) {
		this.paramLabelCobertura = paramLabelCobertura;
	}

	public String getParamMesGeneral() {
		return paramMesGeneral;
	}

	public void setParamMesGeneral(String paramMesGeneral) {
		this.paramMesGeneral = paramMesGeneral;
	}

	public String getMessageError() {
		return messageError;
	}

	public void setMessageError(String messageError) {
		this.messageError = messageError;
	}

	public boolean isValidForm() {
		return validForm;
	}

	public void setValidForm(boolean validForm) {
		this.validForm = validForm;
	}

	public String getParamAnioGeneral() {
		return paramAnioGeneral;
	}

	public void setParamAnioGeneral(String paramAnioGeneral) {
		this.paramAnioGeneral = paramAnioGeneral;
	}

}